package com.kurt.service;

import com.kurt.dto.OrganizationDTO;
import com.kurt.dto.create.OrganizationCreateRequest;
import com.kurt.dto.query.OrganizationQueryRequest;
import com.kurt.dto.update.OrganizationUpdateRequest;
import com.kurt.entity.SysOrganization;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 组织服务接口
 * 提供组织相关的业务逻辑方法
 */
public interface OrganizationService extends BaseService<SysOrganization, Long> {

    /**
     * 创建组织
     *
     * @param createRequest 创建请求
     * @return 组织信息
     */
    OrganizationDTO createOrganization(OrganizationCreateRequest createRequest);

    /**
     * 更新组织
     *
     * @param updateRequest 更新请求
     * @return 组织信息
     */
    OrganizationDTO updateOrganization(OrganizationUpdateRequest updateRequest);

    /**
     * 根据ID获取组织详情
     *
     * @param id 组织ID
     * @return 组织信息
     */
    OrganizationDTO getOrganizationById(Long id);

    /**
     * 分页查询组织
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    Page<OrganizationDTO> getOrganizationPage(OrganizationQueryRequest queryRequest);

    /**
     * 根据条件查询组织列表
     *
     * @param queryRequest 查询请求
     * @return 组织列表
     */
    List<OrganizationDTO> getOrganizationList(OrganizationQueryRequest queryRequest);

    /**
     * 删除组织
     *
     * @param id 组织ID
     * @return 是否成功
     */
    boolean deleteOrganization(Long id);

    /**
     * 批量删除组织
     *
     * @param ids 组织ID列表
     * @return 是否成功
     */
    boolean deleteOrganizations(List<Long> ids);

    /**
     * 获取组织树
     *
     * @param parentId 父组织ID
     * @return 组织树
     */
    List<OrganizationDTO> getOrganizationTree(Long parentId);

    /**
     * 获取所有组织树
     *
     * @return 组织树
     */
    List<OrganizationDTO> getAllOrganizationTree();

    /**
     * 根据父组织ID获取子组织列表
     *
     * @param parentId 父组织ID
     * @return 子组织列表
     */
    List<OrganizationDTO> getChildrenByParentId(Long parentId);

    /**
     * 检查组织名称是否存在
     *
     * @param name 组织名称
     * @return 是否存在
     */
    boolean existsByName(String name);

    /**
     * 检查组织名称是否存在（排除指定ID）
     *
     * @param name      组织名称
     * @param excludeId 排除的组织ID
     * @return 是否存在
     */
    boolean existsByNameAndIdNot(String name, Long excludeId);

    /**
     * 移动组织到新的父组织下
     *
     * @param id          组织ID
     * @param newParentId 新父组织ID
     * @return 是否成功
     */
    boolean moveOrganization(Long id, Long newParentId);

    /**
     * 更新组织排序
     *
     * @param id        组织ID
     * @param sortOrder 排序号
     * @return 是否成功
     */
    boolean updateSortOrder(Long id, Integer sortOrder);
}
